package server.gui;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;

import server.Login;

/**
 * Clase JDialog para administrar los usuarios.
 * @author inlacou
 *
 */
public class JDialogAdminUsuarios extends JDialog{
	
	private Dimension minSize;
	private Dimension size;
	
	private JFrameAdmin jFP;
	private JDialogAdminUsuarios jdA;
	
	private JTable tUsuarios;
	private DefaultTableModel tbm;
	private ArrayList<Login> loginList;
	
	private Box pBotones;
	private JButton bGuardar;
	private JButton bSalir;
	
	private JButton bAnadir;
	private JButton bEliminar;
	
	private String[][] valores;
	
	/**
	 * Metodo main de la clase.
	 * @param jfPadre
	 * @param modality
	 */
	public JDialogAdminUsuarios(JFrameAdmin jfPadre, ModalityType modality){
		super(jfPadre, "Usuarios", modality);
		
		//Inicializacion de variables
		
		jFP = jfPadre;
		jdA = this;
		
		pBotones = Box.createHorizontalBox();
		bGuardar = new JButton("Guardar");
		bSalir = new JButton("Salir");
		bAnadir = new JButton("Anadir");
		bGuardar.setEnabled(false);
		bEliminar = new JButton("Eliminar");
		
		loginList = jFP.getServer().getLoginList();
		
		valores = arrayListToArray(loginList);
		
		String[] campos = new String[]{"Usuario", "Contrasena"};
		
		tbm = new TableModelAdmin(valores, campos);
		tUsuarios = new JTable(tbm);
		
		minSize = new Dimension(370, 110+tUsuarios.getRowCount()*14);
		
		tbm.setColumnIdentifiers( new String[] { "Usuario", "Contrasena" } );
		tUsuarios.getColumn("Usuario").setPreferredWidth( 100 );
		tUsuarios.getColumn("Contrasena").setPreferredWidth( 100 );
		
		tUsuarios.setPreferredScrollableViewportSize(new Dimension(200,150));
		tUsuarios.setAutoscrolls(true);
		
		//Listeners
		bAnadir.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				JDialogAnadirUsuario jdAU = new JDialogAnadirUsuario(jdA, "Anadir usuario", ModalityType.APPLICATION_MODAL, jFP);
				jdAU.setVisible(true);
			}
		});
		
		bSalir.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				((JDialog)((Component)arg0.getSource()).getParent().getParent().getParent().getParent().getParent()).dispose(); //Obtiene padres hasta llegar al JDialog
			}
		});
		
		tbm.addTableModelListener(new TableModelListener() {
			
			@Override
			public void tableChanged(TableModelEvent arg0) {
				bGuardar.setEnabled(true);
			}
		});
		
		bEliminar.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				int[] lineas = tUsuarios.getSelectedRows();
				//for(int r = 0; r < lineas.length; r++){
					//for(int c = 0; c < tUsuarios.getColumnCount(); c++){
						//String s = String.valueOf(tUsuarios.getValueAt(r, c));
					//}
				//}
				for(int i = 0; i < lineas.length; i++){
					tbm.removeRow(lineas[i]-i);
				}
			}
		});
		
		bGuardar.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				String[][] s = new String[tUsuarios.getRowCount()][2];
				
				for(int r = 0; r < tUsuarios.getRowCount(); r++){
					for(int c = 0; c < tUsuarios.getColumnCount(); c++){
						s[r][c] = new String((String)(tUsuarios.getValueAt(r, c)));
					}
				}
				
				jFP.getServer().setLoginList(arrayToArrayList(s));
			}
		});
		
		//Carga de la configuracion
		load();
		
	}
	
	/**
	 * Metodo que carga la configuracion.
	 */
	private void load(){
		this.setLocation(	(int)jFP.getLocation().getX()+(int)jFP.getSize().getWidth()/3,
				(int)jFP.getLocation().getY()+(int)jFP.getSize().getHeight()/3
		); //Coloca esta ventana en una posicion relativa a su JFrame padre.
		this.setMinimumSize(minSize);
		this.setLayout(new BorderLayout());
		this.getContentPane().add(new JScrollPane(tUsuarios), BorderLayout.CENTER);
		pBotones.add(bGuardar);
		pBotones.add(bSalir);
		pBotones.add(Box.createGlue());
		pBotones.add(bAnadir);
		pBotones.add(bEliminar);
		this.getContentPane().add(pBotones, BorderLayout.SOUTH);
	}
	
	/**
	 * Metodo que pasa un ArrayList<Login> a un String[][].
	 * @param l
	 * @return
	 */
	private String[][] arrayListToArray(ArrayList<Login> l){
		String[][] o;
		
		o = new String[l.size()][2];
		Login login;
		for (int i = 0; i<l.size(); i++) {
			login = l.get(i);
			o[i][0] = login.getUsuario();
			o[i][1] = login.getPass();
		}
		
		return o;
	}
	
	/**
	 * Metodo que pasa un String[][] a un ArrayList<Login>.
	 * @param o
	 * @return
	 */
	private ArrayList<Login> arrayToArrayList(String[][] o){
		ArrayList<Login> l;
		l = new ArrayList<Login>();
		Login login;
		for (int i = 0; i < o.length; i++) {
			login = new Login((String)(o[i][0]), (String)(o[i][1]));
			l.add(login);
		}
		return l;
	}
	
	/**
	 * Metodo para a�adir una nueva linea a la tabla.
	 * @param s
	 */
	public void anadir(String[] s){
		tbm.insertRow(tUsuarios.getRowCount(), s);
		repaint();
	}
	
	/**
	 * Metodo para eliminar una de las lineas de la tabla.
	 */
	public void eliminar(){
		int[] lineas = tUsuarios.getSelectedRows();
		for(int i = 0; i < lineas.length; i++){
			tbm.removeRow(lineas[i]-i);
		}
		repaint();
	}
	
	/**
	 * Metodo que redibuja la ventana, en funcion del numero de lineas de la tabla.
	 */
	public void repaint(){
		size = new Dimension(370, 110+tUsuarios.getRowCount()*14);
		this.setSize(size);
	}
}
